package com.moyuwanjia.ui;

import com.moyuwanjia.mapper.IUserMapper;
import com.moyuwanjia.service.UserService;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

/**
 * @author 摸鱼丸加~
 * @create 2022-04-19 11:26
 * 模拟表现层，用于调用业务层
 */
public class Client01_applicationContext {
    /**
     * 获取spring的ioc核心容器，并根据id获取对象
     * @param args
     * <p>
     *     ApplicationContext的三个常用实现类：
     *     (常用方式) ClassPathXmlApplicationContext:它可以记载类路径下的配置文件，要求配置文件必须在类路径下，不在的话，无法加载。
     *              FileSystemXmlApplicationContext:它可以加载磁盘任意路径下的配置文件（前提是拥有磁盘文件夹的访问权限）
     *              AnnotationConfigApplicationContext:它是用于注解的方式创建容器。
     * </p>
     */
    public static void main(String[] args){
        // new创建对象的方式使得程序的独立性很差，所以要设法解耦

//              --------------------ApplicationContext的方式(立即加载)------------------------
//      方式一：
//                UserService service = new UserServiceImpl();
//              1.在spring中，通过核心容器对象解析（ClassPathXmlApplicationContext实现类的方式）
                ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
//      方式二:
        //      1.在spring中，通过核心容器对象解析（FileSystemXmlApplicationContext实现类的方式）
                ApplicationContext fileSystemXmlApplicationContext = new FileSystemXmlApplicationContext("E:\\Spring+SpringMVC+MyBatis\\StudySpring20220418\\Code\\study_spring02_ioc\\src\\main\\resources\\bean.xml");




//              2.根据xml中配置的bean的id读取对应信息,这里获取的方式很多，演示了两种获取方式
//              2.1.获取到id对应的对象后，进行强转
                UserService userService = (UserService) applicationContext.getBean("userService");
//              2.2.同样通过id获取，我们传递一个字节码，让spring自动强转
                IUserMapper userMapper = applicationContext.getBean("userMapper",IUserMapper.class);

                System.out.println(userService);
                System.out.println(userMapper);


//              --------------------BeanFactory的方式（使用时加载，延迟加载）------------------------
        //首先通过Resource对象读取到xml文件
        Resource classPathResource = new ClassPathResource("bean.xml");
        //再通过Bean工厂对象
        BeanFactory xmlBeanFactory = new XmlBeanFactory(classPathResource);
        UserService bean =(UserService) xmlBeanFactory.getBean("userService");
        System.out.println(bean);

    }
}
